package com.edu.repository;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.commons.io.FileUtils;
import org.aspectj.weaver.patterns.IfPointcut.IfFalsePointcut;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Repository;

import com.edu.exception.FileException;
import com.edu.util.ZFilenameUtils;
import com.edu.vo.FileVO;
import com.edu.vo.SimpleTree;
import com.fasterxml.jackson.databind.ObjectMapper;

@Repository
public class FileRespository {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    /**
     * 遍历查询文件夹下所有内容 （不使用递归，只查询一层）
     *
     * @param dir 相对路径 如：访问 root目录 传入"","/",null均可 访问core目录传入core即可
     * @return
     */
    public List<FileVO> getDirContent(File file) {
        List<FileVO> fileList = new ArrayList<>();
        for (File f : file.listFiles()) {
            fileList.add(new FileVO(f));
        }
        return fileList;
    }

    //

    /**
     * 创建文件 1. 文件名不能含有特殊字符 2. 文件名不能与当前的文件或文件夹重名,如果存在重名，提示用户重命名后创建
     *
     * @param dir
     * @param fileName
     * @throws NameIllegalException
     * @throws NameAlreadyExistsException
     * @throws IOException
     */
    public void createDocument(File file) throws IOException {
        File parentFile = file.getParentFile();
        parentFile.mkdirs();
        file.createNewFile();
    }

    // 用于遍历文件夹
    public void iteratorPath(String dir, SimpleTree tree) throws FileException {

        File file = new File(dir);

        if (!file.exists()) {
            throw new FileException(FileException.FILE_NOT_FOUND);
        }

        if (file.isDirectory()) {

            File[] files = file.listFiles();
            for (File f : files) {
                SimpleTree node = new SimpleTree(f.getName());
                tree.addNode(node);
                iteratorPath(f.getAbsolutePath(), node);
            }

        }

    }


    // 创建目录
    public void createDir(File file) {
        file.mkdirs();
    }

    public void upload(File file) {

    }

    // 删除文件或目录
    public void deleteFile(File file) throws FileException, IOException {

        if (file == null || !file.exists()) {
            throw new FileException(FileException.FILE_NOT_FOUND);
        }
        FileUtils.forceDelete(file);
    }

    public void renameFile(File source, File target) throws IOException, FileException {
        // 此处慎用File#renameTo方法。原因： https://blog.csdn.net/hui_2016/article/details/73332759
        // source.renameTo(target);
        if (source.isDirectory()) {
            FileUtils.copyDirectory(source, target);
        } else if (source.isFile()) {
            FileUtils.copyFile(source, target);
        } else {
            throw new FileException(FileException.FILE_TYPE_INCORRECT);
        }
        FileUtils.forceDelete(source);
    }

    public void copyToDir(File source, File target) throws IOException {
        FileUtils.copyToDirectory(source, target);
    }
}
